COMO COMPARAR ENTRADA E SAÍDA DE PRODUTOS

Como buscar entrada e saída de produto por um período com sql?

Como buscar entrada e saída de produto por um período com sql?

Para isso é usado principalmente UNION e GROUP BY assim:

Segue abaixo um exemplo de consulta por entrada e saída de produtos. Primeiro é feito a query depois comentado.



SELECT  
#Aqui é iniciado a camada externa do select usada para agrupar os dois select do union  
cod_barra, descricao,  pmc, grupo, preco,
#Passados algumas variáveis referente ao produto 
SUM(quant_venda) as quant_venda, 
#Soma da quantidade de venda  
sum(vlr_venda) as vlr_venda,  
#Soma do valor de venda
SUM(total_venda) as total_venda,
 #Soma do total de venda
SUM(quant_compra) as quant_compra, 
 #Soma da quantidade de compra
sum(vlr_compra) as vlr_compra,
#Soma do valor de compra
SUM(total_compra) as total_compra
#Soma do total de compra
from (
#Referencia os agrupamentos e unions nos dois selects de compra e venda
select  
#inicio do primpeiro select referente a venda
p.cod_barra, p.descricao, p.pmc, p.grupo, p.preco,  
#Passadas as variáveis igual ao geral e as vendas
round(sum(vp.quantid), 0) as quant_venda,
#Soma da quantidade de venda igual a geral e usado a função ROUND para formatar o número e colocar zero caso não tenha valor
ROUND(sum(vp.vlr_item) / sum(vp.quantid), 2) AS vlr_venda,
#Soma do valor de venda igual a geral e usado a função ROUND para formatar o número e colocar duas casas decimais no número
ROUND(sum(vp.vlr_item), 2) AS total_venda,
#Soma do total de venda igual a geral e usado a função ROUND para formatar o número e colocar duas casas decimais
null as quant_compra, null as vlr_compra, null as total_compra
#Passadas as variáveis nulas para completar a tabela do UNION  
from produto p  
#Referencia a tabela de produtos
inner join vendas_item vp on (vp.cod_barras = p.cod_barra)
#Vincula a tabela de produto com a tabela de item das vendas
inner join vendas_cab v on (v.numero = vp.numero and  
#Vincula a tabela de itens de venda com o cabeçalho de vendas
v.data >= :data_ini and  
#Usa a data para limitar o join, poderia ser feito com where também
v.data <= :data_fim)  
#Mesmo que a outra data, mas uma inicial e outra final
group by p.cod_barra, p.descricao  
#Agrupa por código de barra e descrição, para alguns bancos é necessário os dois
union  
#Faz o UNION dos dois select
select
#Inicia o select para compra igual o da venda
p.cod_barra, p.descricao,p.pmc, p.grupo, p.preco,  
#variáveis de produto...
null as quant_venda, null as vlr_venda, null as total_venda,
#Variáveis com valores null para equilibrar a tabela
round(sum(cp.quantid), 0) as quant_compra,
ROUND(sum(cp.vlr_prod) / sum(cp.quantid), 2) AS vlr_compra,
ROUND(sum(cp.vlr_prod), 2) AS total_compra
from produto p
inner join compra_itens cp on (cp.cod_ean = p.cod_barra)
inner join compra_cab c on (c.numero = cp.numero and 
c.data_lct >= :data_ini and
c.data_lct <= :data_fim )        
group by p.cod_barra, p.descricao   
) as geral
group by cod_barra, descricao, pmc, grupo, preco  
#Agrupa os selects de compra e venda


Este é um exemplo de agrupamento de entrada e saída de produto, ela dá um norte e pode ser completada com outras tabelas como fornecedor ou clientes.

Foi solicitado fazer um comparativo entre as vendas e as compras de produtos por período, mas usando apenas joins ele duplicava as linhas e multiplicava os valores, usando subqueries ou seja select dentro de select a consulta ficava muito lenta, por isso foi usado UNION com agrupamentos.



Como ajustar quantidade de colunas em um union no banco de dados?

Como ajustar quantidade de colunas em um union no banco de dados?

Usa-se campos NULL nos selects com menor número de colunas.

Um erro bem comum ao tentar usar o UNION em banco de dados SQL é fazer os selects chamando quantidade de colunas diferentes. Para ele funcionar a quantidade de colunas dos selects deve ser a mesma, para ficar simétrico.
Em uma consulta simples ficaria assim, por exemplo:

    SELECT campo1, campo2 FROM tabela
     union
    SELECT campo3, campo4 FROM tabela

Se a consulta fosse feita assim:

   SELECT campo1, campo2 FROM tabela
    union
   SELECT campo3 FROM tabela

Não iria funcionar. No mySql em português retornaria a mensagem de erro: 

#1222 - Os comandos SELECT usados têm diferente número de colunas

Se for necessário fazer a consulta com quantidades diferentes de campos, deve ser informada na consulta de menor quantidade de campos, um campo com valor nulo.
Ficando assim:


   SELECT campo1, campo2 FROM tabela
    union
   SELECT campo3, null FROM tabela



Para que serve union em sql?

Para que serve union em sql?

Une duas queries no banco de dados em sequência.

Diferente do join que faz as ligações necessárias e monta a query o union executa duas ou mais queries distintas e retorna o resultado em sequencia.

Por exemplo, se no banco de dados existe duas tabelas uma para compra e outra para venda e quer ver os registro de movimento dos itens de cada tabela usa o union para fazer essa consulta buscando em uma e depois na outra.

Também é usada para determinar o menor preço de venda onde existe uma tabela de produto, outra de preço, outra de promoções com algumas diárias e outras mensais. Pode se fazer a consulta ligando os itens com essas tabelas separando ou tipos e depois juntando tudo com union para a comparação.

Veja também: Quais as restrições no uso de union?.



botão de compartilhamento whatsapp botão de compartilhamento no twiter botão de compartilhamento do site botão de compartilhamento no linkedin botão de compartilhamento whatsapp